package epucjr.psicopuc.dominio;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;

import org.hibernate.search.annotations.ContainedIn;
import org.hibernate.search.annotations.DocumentId;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.IndexedEmbedded;

@Entity
@Indexed
public class Curriculo {

	/************************
	 * ATRIBUTOS
	 ***********************/
	@Id
	@DocumentId
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private long idCurriculo;
	
	@OneToOne(fetch = FetchType.LAZY , cascade = CascadeType.ALL)
	@JoinColumn
	private Atividade atividade;
	
	@OneToMany(fetch = FetchType.LAZY , cascade = CascadeType.ALL)
	@IndexedEmbedded
	@ContainedIn
	@JoinColumn(name="id_curriculo")
	private List<Idioma> idiomas;
	
	@OneToMany(fetch = FetchType.LAZY , cascade = CascadeType.ALL)	
	@IndexedEmbedded
	@ContainedIn
	@JoinColumn(name="id_curriculo")
	private List<Escolaridade> escolaridade; 
	
	@OneToMany(fetch = FetchType.LAZY , cascade = CascadeType.ALL)
	@IndexedEmbedded
	@ContainedIn
	@JoinColumn(name="id_curriculo")
	private List<Deficiencia> deficiencias; 
	
	@OneToMany(fetch = FetchType.LAZY , cascade = CascadeType.ALL)
	@IndexedEmbedded
	@ContainedIn
	@JoinColumn(name="id_curriculo")
	private List<Informatica> informaticas;
	
	@OneToOne(fetch = FetchType.LAZY , cascade = CascadeType.ALL)
	@JoinColumn
	@IndexedEmbedded
	private ExperienciaProfissional experienciasProfissional;
	
	@OneToMany(fetch = FetchType.LAZY , cascade = CascadeType.ALL)
	@JoinColumn
	private List<Comunicacao> comunicacao;
	
	
	private String informacoesComplementares;
	@Field
	private String areaDeInteresse;
	
	
	/*@ContainedIn
	@OneToOne(mappedBy="curriculo")	*/
	//private Candidato candidato;
	
	
	/************************
	 * CONSTRUTOR
	 ***********************/

	public Curriculo() {
		this.atividade = new Atividade();
		this.idiomas = new ArrayList<Idioma>();
		this.deficiencias = new ArrayList<Deficiencia>();
		this.escolaridade = new ArrayList<Escolaridade>();
		this.informaticas = new ArrayList<Informatica>();
		this.comunicacao = new ArrayList<Comunicacao>();
		this.informacoesComplementares = "";
		this.areaDeInteresse = "";
	}
	
	public Curriculo(String informacoesComplementares,
			String areaDeInteresse) {
		this.atividade = new Atividade();
		this.idiomas = new ArrayList<Idioma>();
		this.deficiencias = new ArrayList<Deficiencia>();
		this.escolaridade = new ArrayList<Escolaridade>();
		this.informaticas = new ArrayList<Informatica>();
		this.comunicacao = new ArrayList<Comunicacao>();
		this.informacoesComplementares = informacoesComplementares;
		this.areaDeInteresse = areaDeInteresse;
	}

	public Curriculo(Atividade atividades, List<Idioma> idiomas, List<Comunicacao> comunicacao,
			List<Escolaridade> escolaridade, List<Deficiencia> deficiencias,
			List<Informatica> informaticas,
			ExperienciaProfissional experienciaProfissional,
			String tipoDeDeficiencia, String areaDeInteresse) {
		super();
		this.atividade = atividades;
		this.idiomas = idiomas;
		this.comunicacao = comunicacao;
		this.escolaridade = escolaridade;
		this.deficiencias = deficiencias;
		this.informaticas = informaticas;
		this.experienciasProfissional = experienciaProfissional;
		this.informacoesComplementares = tipoDeDeficiencia;
		this.areaDeInteresse = areaDeInteresse;
	}

	/************************
	 * METODOS
	 ***********************/

	public void adicionarIdiomas(Idioma idioma){
		this.idiomas.add(idioma);
	}
	
	public void adicionarEscolaridade(Escolaridade escolaridade){
		this.escolaridade.add(escolaridade);
	}
	
	public void adicionarDeficiencia(Deficiencia deficiencia){
		this.deficiencias.add(deficiencia);
	}
	
	public void adicionarInformatica(Informatica informatica){
		this.informaticas.add(informatica);
	}
	
	public void adicionarComunicacao(Comunicacao comunicacao){
		this.comunicacao.add(comunicacao);
	}
	
	
	

	/************************
	 * GETTERS/SETTERS
	 ***********************/	

	public long getIdCurriculo() {
		return idCurriculo;
	}

	public void setIdCurriculo(long idCurriculo) {
		this.idCurriculo = idCurriculo;
	}
	
	public String getInformacoesComplementares() {
		return informacoesComplementares;
	}

	public void setInformacoesComplementares(String informacoesComplementares) {
		this.informacoesComplementares = informacoesComplementares;
	}

	public String getAreaDeInteresse() {
		return areaDeInteresse;
	}

	public void setAreaDeInteresse(String areaDeInteresse) {
		this.areaDeInteresse = areaDeInteresse;
	}
	
	public List<Idioma> getIdiomas() {
		return idiomas;
	}
	public void setIdiomas(List<Idioma> idiomas) {
		this.idiomas = idiomas;
	}
	
	public List<Escolaridade> getEscolaridade() {
		return escolaridade;
	}
	public void setEscolaridade(List<Escolaridade> escolaridade) {
		this.escolaridade = escolaridade;
	}
	
	public List<Deficiencia> getDeficiencias() {
		return deficiencias;
	}
	public void setDeficiencias(List<Deficiencia> deficiencias) {
		this.deficiencias = deficiencias;
	}
	
	public List<Informatica> getInformaticas() {
		return informaticas;
	}
	public void setInformaticas(List<Informatica> informaticas) {
		this.informaticas = informaticas;
	}
	
	public ExperienciaProfissional getExperienciasProfissionais() {
		return experienciasProfissional;
	}
	public void setExperienciasProfissionais(ExperienciaProfissional experienciasProfissionais) {
		this.experienciasProfissional = experienciasProfissionais;
	}

	/*public Candidato getCandidato() {
		return candidato;
	}

	public void setCandidato(Candidato candidato) {
		this.candidato = candidato;
	}*/

	public Atividade getAtividade() {
		return atividade;
	}

	public void setAtividade(Atividade atividade) {
		this.atividade = atividade;
	}

	public ExperienciaProfissional getExperienciasProfissional() {
		return experienciasProfissional;
	}

	public void setExperienciasProfissional(
			ExperienciaProfissional experienciasProfissional) {
		this.experienciasProfissional = experienciasProfissional;
	}

	public List<Comunicacao> getComunicacao() {
		return comunicacao;
	}

	public void setComunicacao(List<Comunicacao> comunicacao) {
		this.comunicacao = comunicacao;
	}
	
	
	
	
	
}
